package org.setamv.springcloud.feign.contract;

import feign.MethodMetadata;
import org.springframework.cloud.netflix.feign.support.SpringMvcContract;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

/**
 * 扩展SpringMvcContract。
 * SpringMvcContract为spring cloud集成feign时默认使用的Contract，该Contract已经对{@linkplain org.springframework.web.bind.annotation.RequestMapping}等注解提供了支持
 * 现在，通过扩展，使得该Contract可以支持自定义的注解 {@linkplain CustomizedHttpRequest}
 * 的feign Contract。spring cloud
 * 注意：要使得自定义的Contract在spring cloud中生效，必须声明其为一个Bean，参见
 */
public class ExSpringMVCContract extends SpringMvcContract {

    @Override
    protected void processAnnotationOnMethod(MethodMetadata data, Annotation methodAnnotation, Method method) {
        super.processAnnotationOnMethod(data, methodAnnotation, method);
        if (CustomizedHttpRequest.class.isInstance(methodAnnotation)) {
            // 通过注解获取设置的 url 和 method。 参见 CustomizedHttpRequest 注解定义
            CustomizedHttpRequest request = method.getAnnotation(CustomizedHttpRequest.class);
            String url = request.url();
            String httpMethod = request.method();
            data.template().method(httpMethod);

            // 将注解配置的url添加到url后面（原来的url只是在Feign.builder().target(clazz, url)中定义的url，一般只包含主机部分）
            // 所以这里只需要将注解上设置的路径加到主机名后面
            data.template().append(url);
        }
    }
}
